package com.l024.easyandroidlib.log.util;

/**
 * @author wu_ming_zhi_bei
 * @date 2021/1/28 23:01
 * @Notes 堆栈信息工具类
 */
public class EasyLogStackTraceUtil {

    /**
     * 获取裁剪后并且只包含包名的信息
     * @param stackTrace
     * @param ignorePackage
     * @param maxDepth
     * @return
     */
    public static StackTraceElement[] getCroppedRealStackTrace(StackTraceElement[] stackTrace,String ignorePackage,int maxDepth){
        return cropStackTrace(getRealStackTrack(stackTrace,ignorePackage),maxDepth);
    }

    /**
     * 裁剪堆栈信息
     * @param callStack
     * @param maxDepth
     * @return
     */
    private static StackTraceElement[] cropStackTrace(StackTraceElement[] callStack,int maxDepth){
        int realDepth = callStack.length;
        if(maxDepth>0){
            realDepth = Math.min(maxDepth,realDepth);
        }
        StackTraceElement[] realStack = new StackTraceElement[realDepth];
        /**
         * Object src : 原数组
         *    int srcPos : 从元数据的起始位置开始
         * 　　Object dest : 目标数组
         * 　　int destPos : 目标数组的开始起始位置
         * 　　int length  : 要copy的数组的长度
         */
        System.arraycopy(callStack,0,realStack,0,realDepth);
        return realStack;
    }

    /**
     * 堆栈去除不包含包名的信息
     */
    private static StackTraceElement[] getRealStackTrack(StackTraceElement[] stackTrace,String ignorePackage){
        int ignoreDepth = 0;
        int allDepth = stackTrace.length;
        String className = "";
        for(int i = allDepth-1;i>=0;i--){
            className = stackTrace[i].getClassName();
            //找到包含当前包名的信息位置
            if(ignorePackage!=null&&className.startsWith(ignorePackage)){
                ignoreDepth = i+1;
                break;
            }
        }
        int realDepth = allDepth-ignoreDepth;
        StackTraceElement[] realStack = new StackTraceElement[realDepth];
        System.arraycopy(stackTrace,ignoreDepth,realStack,0,realDepth);
        return realStack;
    }
}
